
#include "nane/core/MemoryStream.h"

#include <algorithm>
#include <cstring>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryStream::MemoryStream( byte* _memBuffer, uint32 _memBufferSize )
        : m_memBuffer( _memBuffer )
        , m_memBufferPointer( _memBuffer )
        , m_memBufferSize( _memBufferSize )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    MemoryStream::~MemoryStream()
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 MemoryStream::Read( byte* _buffer, uint32 _count )
    {
        uint32 toRead = std::min(m_memBufferSize - Tell(), _count);
        std::memcpy(_buffer, m_memBufferPointer, toRead);
        m_memBufferPointer += toRead;
        return toRead;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 MemoryStream::Write( const byte* _data, uint32 _count )
    {
        int toWrite = std::min(m_memBufferSize - Tell(), _count);
        std::memcpy(m_memBufferPointer, _data, toWrite);
        m_memBufferPointer += toWrite;
        return toWrite;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void MemoryStream::Seek( uint32 _pos )
    {
        if( _pos >= 0 && _pos <= m_memBufferSize )
        {
            m_memBufferPointer = m_memBuffer + _pos;
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 MemoryStream::Tell()
    {
        return (m_memBufferPointer-m_memBuffer);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 MemoryStream::Size() const
    {
        return m_memBufferSize;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
